package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

//路由与路由组

func main() {
	r := gin.Default()

	//访问 /index 的 GET 请求会走这一条处理逻辑
	//路由
	//获取某个信息
	r.GET("/index", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"method": "GET",
		})
	})

	//创建某个信息
	r.POST("/index", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"method": "POST",
		})
	})

	//更新某个信息
	r.PUT("/index", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"method": "PUT",
		})
	})

	//删除某个信息
	r.DELETE("/index", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{
			"method": "DELETE",
		})
	})

	//Any：请求方法的大集合/大杂烩，可以匹配所有请求方法
	r.Any("/user", func(context *gin.Context) {
		switch context.Request.Method {
		case "GET":
			context.JSON(http.StatusOK, gin.H{"method": "GET"})
		case http.MethodPost:
			context.JSON(http.StatusOK, gin.H{"method": "POST"})
		case http.MethodPut:
			context.JSON(http.StatusOK, gin.H{"method": "PUT"})
		case http.MethodDelete:
			context.JSON(http.StatusOK, gin.H{"method": "DELETE"})
		}
	})

	//NoRoute 用户访问一些不存在的在网站上没有定义路由的那些机制，会执行下面的代码。默认会返回404，但也可以修改为其他的（如：下面的例子）
	r.NoRoute(func(context *gin.Context) {
		context.JSON(http.StatusNotFound, gin.H{"msg": "liwenzhou.com"})
	})

	//视频的首页和详情页
	/*r.GET("/video/index", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{"msg": "/video/index"})
	})
	r.GET("/video/xx", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{"msg": "/video/xx"})
	})
	r.GET("/video/oo", func(context *gin.Context) {
		context.JSON(http.StatusOK, gin.H{"msg": "/video/oo"})
	})*/
	//路由组 多用于区分不同的 业务线 或 API版本
	//把共用的前缀提取出来，创建一个路由组
	videoGroup := r.Group("/video")
	{ //花括号不是必须得，但是写上之后结构更加的清晰
		videoGroup.GET("/index", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/video/index"})
		})
		videoGroup.GET("/xx", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/video/xx"})
		})
		videoGroup.GET("/oo", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/video/oo"})
		})
	}

	//路由组的嵌套
	shopGruop := r.Group("/shop")
	{
		shopGruop.GET("/index", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/shop/index"})
		})
		shopGruop.GET("/cart", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/shop/cart"})
		})
		shopGruop.POST("/checkout", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/shop/checkout"})
		})
		//嵌套路由组
		xx := shopGruop.Group("xx")
		xx.GET("/oo", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/shop/xx/oo"})
		})
		xx.GET("/cc", func(context *gin.Context) {
			context.JSON(http.StatusOK, gin.H{"msg": "/shop/xx/cc"})
		})
	}

	r.Run(":8080")
}
